還記得陣列怎麼賦值嗎,Day15 - 基礎(4):陣列處理、JSON
我們先來複習一下,我把 a, b, c 三個鍵分別設定成 air, bag, cat
$array = [];
$array['a'] = 'air';
$array['b'] = 'bag';
$array['c'] = 'cat';
print_r($array);
// [a] => air
// [b] => bag
// [c] => cat
然後我再把 a 設定成 apple,air 就自動消失了
$array['a'] = 'apple';
print_r($array);
// [a] => apple
// [b] => bag
// [c] => cat
你應該想到了吧,如果把人當成鍵、選擇的選項當成值的話
$array = [
// 人 => 選項
];
$array['阿明'] = 'a';
$array['小美'] = 'b';
$array['昊昊'] = 'c';
print_r($array);
// [阿明] => a
// [小美] => b
// [昊昊] => c
昊昊改成選擇 a,完全不需要做新增移除的動作,直接賦值就行了
$array['昊昊'] = 'a';
print_r($array);
// [阿明] => a
// [小美] => b
// [昊昊] => a
如果反過來選項當成鍵、人當成值的話就會變成二維陣列,而且還要做新增移除,明顯麻煩了許多
先來執行程式看看按鈕會回傳什麼,方便用來找值在陣列的哪裡
來到 processCallbackQuery()
,將 $msg_id
$chat_id
$user_id
找出來,還有加上三個 if 來處理 data
接著就是用剛剛學到的陣列特性,$path
則是決定資料要放的地方,因為會有很多個頻道,頻道裡又有很多則訊息,所以就用了 $chat_id
和 $msg_id
當作路徑和檔名
突然覺得同樣的東西要寫三遍,這樣不太對,我可是超懶的,怎麼可以寫三遍呢,所以這邊要改一下,把 callback_data
前面加上 channel_post
之後這邊改一下,噹啷~變成只剩一個 if
如果檔案已經存在的話,就把檔案讀取出來,然後用陣列的特性修改資料,最後再存回去,不然的話就新增一個陣列還有存進一個新檔案
至於為何選擇用 fopen
,這是因為如果有兩個人同時按了按鈕,此時有可能會只存到一個人的資料,導致另一個人按了按鈕結果資料被吃掉,詳細情況可以複習一下這篇文章 Day16 - 基礎(5):檔案讀取與寫入、cURL
接著要來計算同一個選項總共被選擇了幾次,先將初始值設成 0,然後用 foreach
把陣列裡的值一個個拿出來看,如果符合條件就 +1,沒有的話就加 +0,這邊是利用了 PHP 自動轉型的特性
最後用三元運算子整理一下,如果次數是 0 就改成空字串,不然就是在前面加一個空白
別忘了更新按鈕的文字,把剛剛計算的數字加上去
這樣就完成啦,計得重新執行程式後要重發一則訊息,因為我們把 callback_data
改了嘛
最後的最後再考考你,如果要能夠收回的話應該怎麼做呢?
辛苦又充實的 30 天終於結束啦,我已經等不急每天看動畫看到爽了,借的書也是一整個月都沒時間翻開,終於能回到我優閒慢活的人生,真是感動
最後來套句六角學院的老話,如果做不出來的話「可以參考答案」:
https://github.com/miku3920/ironman2021_by_miku3920_bot
這隻機器人我已經放上伺服器 24 小時運行中,歡迎拿來使用看看,如果還有想加的功能也歡迎發 PR 或 issue